package com.qsxc.system.exception;

public class TcpSessionCloseException extends Exception {

    /**
     * 
     */
    private static final long serialVersionUID = -5431623026071792168L;

    private String sim;

    /**
     * @param msg 错误信息
     */
    public TcpSessionCloseException(String msg, String sim) {
        super(msg);
        this.sim = sim;
    }

    /**
     * @param msg 错误信息
     * @param t 子级异常
     */
    public TcpSessionCloseException(String msg, String sim, Throwable t) {
        super(msg, t);
        this.sim = sim;
    }

    public String getSim() {
        return sim;
    }

    /**
     * 获得多层嵌套的Exception中，最里一层的exception中的msg信息。
     * 
     * @return 最里一层异常的msg
     */
    public String getRootMsg() {
        return getRootMsg(this);
    }

    /**
     * 获得多层嵌套的Exception中，每一层的exception中的msg信息。 并按照从外向内的顺序组成一个字符串。
     * 
     * @return 每层的msg信息
     */
    public String getFullMsg() {
        return getFullMsg(this);
    }

    /**
     * {@link #getRootMsg()}的具体实现。
     * 
     * @param e 异常
     * @return 最里一层异常的msg
     */
    private String getRootMsg(Throwable e) {
        String msg;
        if (e.getCause() != null) {
            msg = getRootMsg(e.getCause());
        } else {
            msg = e.getMessage();
        }
        return msg;
    }

    /**
     * {@link #getFullMsg()}的具体实现。
     * 
     * @param e 异常
     * @return 每层的msg信息
     */
    private String getFullMsg(Throwable e) {
        StringBuilder sb = new StringBuilder();
        sb.append("->");
        Throwable t = e;
        while (t.getCause() != null) {
            sb.append(t.getMessage()).append("->");
            t = t.getCause();
        }
        sb.append(t.getMessage());
        return sb.toString();
    }
}
